package org.example.controller;

import cn.hutool.core.io.IoUtil;
import jakarta.annotation.Resource;
import org.example.service.UserService;
import org.example.service.impl.UserServiceImpl;
import org.example.test.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@RestController
public class UserController {
    // private UserService userService = new UserServiceImpl();
    // 属性注入，隐藏了类间依赖关系，可能破坏类的封装性，底层是通过反射实现的
    // 当有多个bean时有三种方法解决 @Primary @Qualifier @Resource
    @Autowired
    @Qualifier("userServiceImpl")

//    等同于上面
//    @Autowired
//    @Qualifier("userServiceImpl")
    @Resource(name = "userServiceImpl2") // 这是javaee提供的，不是spring，默认按照名称注入，spring的按照类型注入
    private UserService userService;

    // 构造器注入，代码安全性高，参数多时构造函数臃肿
//    @Autowired  // 只有一个构造器的时候该注解可以省略，可以把成员变量设置为final
//    public UserController(UserService userService) {
//        this.userService = userService;
//    }

    // set方法注入，保证了封装性，依赖关系清晰，但需要额外编写setter方法
//    @Autowired
//    public void setUserService(UserService userService) {
//        this.userService = userService;
//    }

//    @RequestMapping("/list")
//    public List<User> list() {
//        //读取数据，使用hutool
//        // InputStream in = new FileInputStream("src/main/resources/user.txt");不推荐
//        InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");
//        ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());
//
//        return lines.stream().map(line -> {
//            String[] split = line.split(",");
//            Integer id = Integer.parseInt(split[0]);
//            String username = split[1];
//            String password = split[2];
//            String name = split[3];
//            Integer age = Integer.parseInt(split[4]);
//            LocalDateTime updateTime = LocalDateTime.parse(split[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//            return new User(id, username, password, name, age, updateTime);
//        }).toList();
//    }

    @RequestMapping("/list")
    public List<User> list() throws FileNotFoundException {
        List<User> userList = userService.findAll();
        return userList;
    }
}
